This repository was archived by the owner on Mar 31, 2025. It is now read-only.
chore(deps): update react-router monorepo to v7 (major)#135
Open
renovate[bot] wants to merge 1 commit intomainfrom
Open
chore(deps): update react-router monorepo to v7 (major)#135renovate[bot] wants to merge 1 commit intomainfrom
renovate[bot] wants to merge 1 commit intomainfrom
Conversation
Reviewer's Guide by SourceryThis pull request updates the react-router and react-router-dom packages to version 7. This is a major version update, which includes breaking changes such as the removal of the defer API, the collapsing of several packages into react-router, and the removal of several future flags. The update also includes several bug fixes and performance improvements. Class diagram showing key API changes in React Router v7classDiagram
class ReactRouter {
+createBrowserRouter()
+createHashRouter()
+createMemoryRouter()
+RouterProvider
+useNavigate()
+useSubmit()
+useRevalidator()
}
class RemovedAPIs {
-defer()
-AbortedDeferredError
-TypedDeferredData
-UNSAFE_DeferredData
-UNSAFE_DEFERRED_SYMBOL
}
class NewFeatures {
+redirectDocument()
+Component/ErrorBoundary props
+lazy() route loading
}
ReactRouter -- RemovedAPIs : Removes
ReactRouter -- NewFeatures : Adds
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
fbaad92 to
01e8c10
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^4.2.0->^7.0.0^4.2.2->^7.0.0Release Notes
remix-run/react-router (react-router)
v7.1.3Compare Source
No changes
v7.1.2Compare Source
Patch Changes
Fix issue with fetcher data cleanup in the data layer on fetcher unmount (#12681)
Do not rely on
symbolfor filtering outredirectresponses from loader data (#12694)Previously, some projects were getting type checking errors like:
Now that
symbols are not used for theredirectresponse type, these errors should no longer be present.v7.1.1Compare Source
v7.1.0Compare Source
Patch Changes
<Link prefetch>warning which suffers from false positives in a lazy route discovery world (#12485)v7.0.2Compare Source
Patch Changes
temporarily only use one build in export map so packages can have a peer dependency on react router (#12437)
Generate wide
matchesandparamstypes for current route and child routes (#12397)At runtime,
matchesincludes child route matches andparamsinclude child route path parameters.But previously, we only generated types for parent routes in
matches; forparams, we only considered the parent routes and the current route.To align our generated types more closely to the runtime behavior, we now generate more permissive, wider types when accessing child route information.
v7.0.1Compare Source
v7.0.0Compare Source
Major Changes
Remove the original
deferimplementation in favor of using raw promises via single fetch andturbo-stream. This removes these exports from React Router: (#11744)deferAbortedDeferredErrortype TypedDeferredDataUNSAFE_DeferredDataUNSAFE_DEFERRED_SYMBOL,@remix-run/routerintoreact-router(#11505)react-router-domintoreact-router@remix-run/server-runtimeintoreact-router@remix-run/testingintoreact-routerRemove single_fetch future flag. (#11522)
Drop support for Node 16, React Router SSR now requires Node 18 or higher (#11391)
Remove
future.v7_startTransitionflag (#11696)useNavigate()useSubmituseFetcher().loaduseFetcher().submituseRevalidator.revalidateRemove
future.v7_normalizeFormMethodfuture flag (#11697)For Remix consumers migrating to React Router, the
cryptoglobal from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-routerrather than platform-specific packages: (#11837)createCookiecreateCookieSessionStoragecreateMemorySessionStoragecreateSessionStorageFor consumers running older versions of Node, the
installGlobalsfunction from@remix-run/nodehas been updated to defineglobalThis.crypto, using Node'srequire('node:crypto').webcryptoimplementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactorycreateSessionStorageFactorycreateCookieSessionStorageFactorycreateMemorySessionStorageFactoryImports/Exports cleanup (#11840)
@remix-run/routerAgnosticDataIndexRouteObjectAgnosticDataNonIndexRouteObjectAgnosticDataRouteMatchAgnosticDataRouteObjectAgnosticIndexRouteObjectAgnosticNonIndexRouteObjectAgnosticRouteMatchAgnosticRouteObjectTrackedPromiseunstable_AgnosticPatchRoutesOnMissFunctionAction-> exported asNavigationTypeviareact-routerRouterexported asDataRouterto differentiate from RR's<Router>getToPathname(@private)joinPaths(@private)normalizePathname(@private)resolveTo(@private)stripBasename(@private)createBrowserHistory-> in favor ofcreateBrowserRoutercreateHashHistory-> in favor ofcreateHashRoutercreateMemoryHistory-> in favor ofcreateMemoryRoutercreateRoutercreateStaticHandler-> in favor of wrappercreateStaticHandlerin RR DomgetStaticContextFromErrorreact-routerHashPathnameSearchupdate minimum node version to 18 (#11690)
Remove
future.v7_prependBasenamefrom the ionternalized@remix-run/routerpackage (#11726)Migrate Remix type generics to React Router (#12180)
Route.*typesRoute.*typesuseFetcherpreviously had an optional generic (used primarily by Remix v2) that expected the data typetypeof loader/typeof action)useFetcher<LoaderData>()useFetcher<typeof loader>()Remove
future.v7_throwAbortReasonfrom internalized@remix-run/routerpackage (#11728)Add
exportsfield to all packages (#11675)node package no longer re-exports from react-router (#11702)
renamed RemixContext to FrameworkContext (#11705)
updates the minimum React version to 18 (#11689)
PrefetchPageDescriptor replaced by PageLinkDescriptor (#11960)
@remix-run/router,@remix-run/server-runtime, and@remix-run/reactnow that they all live inreact-router(#12177)LoaderFunction,LoaderFunctionArgs,ActionFunction,ActionFunctionArgs,DataFunctionArgs,RouteManifest,LinksFunction,Route,EntryRouteRouteManifesttype used by the "remix" code is now slightly stricter because it is using the former@remix-run/routerRouteManifestRecord<string, Route> -> Record<string, Route | undefined>AppDatatype in favor of inliningunknownin the few locations it was usedServerRuntimeMeta*types in favor of theMeta*types they were duplicated fromfuture.v7_partialHydrationflag (#11725)<RouterProvider fallbackElement>propfallbackElementto ahydrateFallbackElement/HydrateFallbackon your root routefuture.v7_partialHydration(when usingfallbackElement),state.navigationwas populated during the initial loadfuture.v7_partialHydration,state.navigationremains in an"idle"state during the initial loadRemove
v7_relativeSplatPathfuture flag (#11695)Drop support for Node 18, update minimum Node vestion to 20 (#12171)
installGlobals()as this should no longer be necessaryRemove remaining future flags (#11820)
v7_skipActionErrorRevalidationv3_fetcherPersist,v3_relativeSplatPath,v3_throwAbortReasonrename createRemixStub to createRoutesStub (#11692)
Remove
@remix-run/routerdeprecateddetectErrorBoundaryoption in favor ofmapRouteProperties(#11751)Add
react-router/domsubpath export to properly enablereact-domas an optionalpeerDependency(#11851)import ReactDOM from "react-dom"in<RouterProvider>in order to accessReactDOM.flushSync(), since that would breakcreateMemoryRouteruse cases in non-DOM environmentsreact-router/domto get the proper component that makesReactDOM.flushSync()available:entry.client.tsx:import { HydratedRouter } from 'react-router/dom'createBrowserRouter/createHashRouter:import { RouterProvider } from "react-router/dom"Remove
future.v7_fetcherPersistflag (#11731)Update
cookiedependency to^1.0.1- please see the release notes for any breaking changes (#12172)Minor Changes
prerenderconfig in the React Router vite plugin, to support existing SSG use-cases (#11539)prerenderconfig to pre-render your.htmland.datafiles at build time and then serve them statically at runtime (either from a running server or a CDN)prerendercan either be an array of string paths, or a function (sync or async) that returns an array of strings so that you can dynamically generate the paths by talking to your CMS, etc.Params, loader data, and action data as props for route component exports (#11961)
Remove duplicate
RouterProviderimpliementations (#11679)Typesafety improvements (#12019)
React Router now generates types for each of your route modules.
You can access those types by importing them from
./+types.<route filename without extension>.For example:
This initial implementation targets type inference for:
Params: Path parameters from your routing config inroutes.tsincluding file-based routingLoaderData: Loader data fromloaderand/orclientLoaderwithin your route moduleActionData: Action data fromactionand/orclientActionwithin your route moduleIn the future, we plan to add types for the rest of the route module exports:
meta,links,headers,shouldRevalidate, etc.We also plan to generate types for typesafe
Links:Check out our docs for more:
Stabilize
unstable_dataStrategy(#11969)Stabilize
unstable_patchRoutesOnNavigation(#11970)Patch Changes
No changes (
506329c4e)chore: re-enable development warnings through a
developmentexports condition. (#12269)Remove unstable upload handler. (#12015)
Remove unneeded dependency on @web3-storage/multipart-parser (#12274)
Fix redirects returned from loaders/actions using
data()(#12021)fix(react-router): (v7) fix static prerender of non-ascii characters (#12161)
Replace
substrwithsubstring(#12080)Remove the deprecated
jsonutility (#12146)Response.jsonif you still need to construct JSON responses in your appRemove unneeded dependency on source-map (#12275)
v6.28.2: v6.28.2Compare Source
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v6282
v6.28.1: v6.28.1Compare Source
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v6281
v6.28.0Compare Source
Minor Changes
json/deferin favor of returning raw objectsPatch Changes
@remix-run/router@1.21.0v6.27.0: v6.27.0Compare Source
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v6270
v6.26.2Compare Source
Patch Changes
@remix-run/router@1.19.2v6.26.1Compare Source
v6.26.0Compare Source
Minor Changes
replace(url, init?)alternative toredirect(url, init?)that performs ahistory.replaceStateinstead of ahistory.pushStateon client-side navigation redirects (#11811)Patch Changes
future.v7_partialHydrationalong withunstable_patchRoutesOnMiss(#11838)router.state.matcheswill now include any partial matches so that we can render ancestorHydrateFallbackcomponents@remix-run/router@1.19.0v6.25.1: v6.25.1Compare Source
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v6251
v6.25.0Compare Source
Minor Changes
Stabilize
future.unstable_skipActionErrorRevalidationasfuture.v7_skipActionErrorRevalidation(#11769)Responsewith a4xx/5xxstatus codeshouldRevalidateshouldRevalidate'sunstable_actionStatusparameter toactionStatusPatch Changes
useMatchso matches/params reflect decoded params (#11789)@remix-run/router@1.18.0v6.24.1Compare Source
Patch Changes
future.v7_relativeSplatPath, properly resolve relative paths in splat routes that are children of pathless routes (#11633)@remix-run/router@1.17.1v6.24.0Compare Source
Minor Changes
Add support for Lazy Route Discovery (a.k.a. Fog of War) (#11626)
unstable_patchRoutesOnMissdocs: https://reactrouter.com/en/main/routers/create-browser-routerPatch Changes
@remix-run/router@1.17.0v6.23.1Compare Source
Patch Changes
<Await>(#11513)@remix-run/router@1.16.1v6.23.0Compare Source
Minor Changes
unstable_dataStrategyconfiguration option (#11098)Patch Changes
@remix-run/router@1.16.0v6.22.3Compare Source
Patch Changes
@remix-run/router@1.15.3v6.22.2Compare Source
Patch Changes
@remix-run/router@1.15.2v6.22.1: v6.22.1Compare Source
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v6221
v6.22.0Compare Source
Patch Changes
@remix-run/router@1.15.0v6.21.3Compare Source
Patch Changes
unstable_prefix fromBlocker/BlockerFunctiontypes (#11187)v6.21.2Compare Source
v6.21.1Compare Source
Patch Changes
route.lazynot working correctly on initial SPA load whenv7_partialHydrationis specified (#11121)@remix-run/router@1.14.1v6.21.0Compare Source
Minor Changes
Add a new
future.v7_relativeSplatPathflag to implement a breaking bug fix to relative routing when inside a splat route. (#11087)This fix was originally added in #10983 and was later reverted in #11078 because it was determined that a large number of existing applications were relying on the buggy behavior (see #11052)
The Bug
The buggy behavior is that without this flag, the default behavior when resolving relative paths is to ignore any splat (
*) portion of the current route path.The Background
This decision was originally made thinking that it would make the concept of nested different sections of your apps in
<Routes>easier if relative routing would replace the current splat:Any paths like
/dashboard,/dashboard/team,/dashboard/projectswill match theDashboardroute. The dashboard component itself can then render nested<Routes>:Now, all links and route paths are relative to the router above them. This makes code splitting and compartmentalizing your app really easy. You could render the
Dashboardas its own independent app, or embed it into your large app without making any changes to it.The Problem
The problem is that this concept of ignoring part of a path breaks a lot of other assumptions in React Router - namely that
"."always means the current location pathname for that route. When we ignore the splat portion, we start getting invalid paths when using".":We've also introduced an issue that we can no longer move our
DashboardTeamcomponent around our route hierarchy easily - since it behaves differently if we're underneath a non-splat route, such as/dashboard/:widget. Now, our"."links will, properly point to ourself inclusive of the dynamic param value so behavior will break from it's corresponding usage in a/dashboard/*route.Even worse, consider a nested splat route configuration:
Now, a
<Link to=".">and a<Link to="..">inside theDashboardcomponent go to the same place! That is definitely not correct!Another common issue arose in Data Routers (and Remix) where any
<Form>should post to it's own routeactionif you the user doesn't specify a form action:This is just a compounded issue from the above because the default location for a
Formto submit to is itself (".") - and if we ignore the splat portion, that now resolves to the parent route.The Solution
If you are leveraging this behavior, it's recommended to enable the future flag, move your splat to it's own route, and leverage
../for any links to "sibling" pages:This way,
.means "the full current pathname for my route" in all cases (including static, dynamic, and splat routes) and..always means "my parents pathname".Patch Changes
@remix-run/router@1.14.0v6.20.1Compare Source
Patch Changes
useResolvedPathfix for splat routes due to a large number of applications that were relying on the buggy behavior (see https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329). We plan to re-introduce this fix behind a future flag in the next minor version. (#11078)@remix-run/router@1.13.1v6.20.0Compare Source
Minor Changes
PathParamtype from the public API (#10719)Patch Changes
resolveToin splat routes (#11045)getPathContributingMatchesUNSAFE_getPathContributingMatchesexport from@remix-run/routersince we no longer need this in thereact-router/react-router-domlayers@remix-run/router@1.13.0v6.19.0Compare Source
Minor Changes
unstable_flushSyncoption touseNavigate/useSumbit/fetcher.load/fetcher.submitto opt-out ofReact.startTransitionand intoReactDOM.flushSyncfor state updates (#11005)unstable_prefix from theuseBlockerhook as it's been in use for enough time that we are confident in the API. We do not plan to remove the prefix fromunstable_usePromptdue to differences in how browsers handlewindow.confirmthat prevent React Router from guaranteeing consistent/correct behavior. (#10991)Patch Changes
Fix
useActionDataso it returns proper contextual action data and not any action data in the tree (#11023)Fix bug in
useResolvedPaththat would causeuseResolvedPath(".")in a splat route to lose the splat portion of the URL path. (#10983)"."paths inside a splat route which incorrectly dropped the splat portion of the URL. If you are relative routing via"."inside a splat route in your application you should double check that your logic is not relying on this buggy behavior and update accordingly.Updated dependencies:
@remix-run/router@1.12.0v6.18.0Compare Source
Patch Changes
futureprop onBrowserRouter,HashRouterandMemoryRouterso that it accepts aPartial<FutureConfig>instead of requiring all flags to be included. (#10962)@remix-run/router@1.11.0v6.17.0Compare Source
Patch Changes
RouterProviderfutureprop type to be aPartial<FutureConfig>so that not all flags must be specified (#10900)@remix-run/router@1.10.0v6.16.0Compare Source
Minor Changes
anywithunknownon exposed typings for user-provided data. To do this in Remix v2 without introducing breaking changes in React Router v6, we have added generics to a number of shared types. These continue to default toanyin React Router and are overridden withunknownin Remix. In React Router v7 we plan to move these tounknownas a breaking change. (#10843)Locationnow accepts a generic for thelocation.statevalueActionFunctionArgs/ActionFunction/LoaderFunctionArgs/LoaderFunctionnow accept a generic for thecontextparameter (only used in SSR usages viacreateStaticHandler)useMatches(now exported asUIMatch) accepts generics formatch.dataandmatch.handle- both of which were already set tounknown@privateclass exportErrorResponseto anUNSAFE_ErrorResponseImplexport since it is an implementation detail and there should be no construction ofErrorResponseinstances in userland. This frees us up to export atype ErrorResponsewhich correlates to an instance of the class viaInstanceType. Userland code should only ever be usingErrorResponseas a type and should be type-narrowing viaisRouteErrorResponse. (#10811)ShouldRevalidateFunctionArgsinterface (#10797)_isFetchActionRedirect,_hasFetcherDoneAnything) (#10715)Patch Changes
@remix-run/router@1.9.0v6.15.0Compare Source
Minor Changes
redirectDocument()function which allows users to specify that a redirect from aloader/actionshould trigger a document reload (viawindow.location) instead of attempting to navigate to the redirected location via React Router (#10705)Patch Changes
useRevalidatoris referentially stable across re-renders if revalidations are not actively occurring (#10707)@remix-run/router@1.8.0v6.14.2Compare Source
Patch Changes
@remix-run/router@1.7.2v6.14.1Compare Source
Patch Changes
unstable_useBlockerwhen used with an unstable blocker function (#10652)@remix-run/router@1.7.1v6.14.0Compare Source
Patch Changes
basenamefrom locations provided tounstable_useBlockerfunctions to matchuseLocation(#10573)generatePathwhen passed a numeric0value parameter (#10612)unstable_useBlockerkey issues inStrictMode(#10573)tsc --skipLibCheck:falseissues on React 17 (#10622)typescriptto 5.1 (#10581)@remix-run/router@1.7.0v6.13.0Compare Source
Minor Changes
Move
React.startTransitionusage behind a future flag to avoid issues with existing incompatibleSuspenseusages. We recommend folks adopting this flag to be better compatible with React concurrent mode, but if you run into issues you can continue without the use ofstartTransitionuntil v7. Issues usually boils down to creating net-new promises during the render cycle, so if you run into issues you should either lift your promise creation out of the render cycle or put it behind auseMemo. (#10596)Existing behavior will no longer include
React.startTransition:If you wish to enable
React.startTransition, pass the future flag to your component:Patch Changes
React.startTransitionminification bug in production mode (#10588)v6.12.1Compare Source
Patch Changes
React.startTransitionto fix webpack + react 17 compilation error (#10569)v6.12.0Compare Source
Minor Changes
React.startTransitionif it exists (#10438)Patch Changes
@remix-run/router@1.6.3v6.11.2Compare Source
Patch Changes
basenameduplication in descendant<Routes>inside a<RouterProvider>(#10492)@remix-run/router@1.6.2v6.11.1Compare Source
Patch Changes
ComponentAPI within descendant<Routes>(#10434)useNavigatefrom<Routes>inside a<RouterProvider>(#10432)<Navigate>in strict mode when using a data router (#10435)@remix-run/router@1.6.1v6.11.0Compare Source
Patch Changes
<Routes>whenRouterProvidererrors existed (#10374)Componentinstead ofelementon a route definition (#10287)useNavigatein the render cycle by setting theactiveRefin a layout effect, allowing thenavigatefunction to be passed to child components and called in auseEffectthere. (#10394)useSyncExternalStoretouseStatefor internal@remix-run/routerrouter state syncing in<RouterProvider>. We found some subtle bugs where router state updates got propagated before other normaluseStateupdates, which could lead to footguns inuseEffectcalls. (#10377, #10409)useRevalidator()to resolve a loader-driven error boundary scenario (#10369)RouterProvider,useNavigate/useSubmit/fetcher.submitare now stable across location changes, since we can handle relative routing via the@remix-run/routerinstance and get rid of our dependence onuseLocation(). When usingBrowserRouter, these hooks remain unstable across location changes because they still rely onuseLocation(). (#10336)@remix-run/router@1.6.0v6.10.0Compare Source
Minor Changes
Added support for Future Flags in React Router. The first flag being introduced is
future.v7_normalizeFormMethodwhich will normalize the exposeduseNavigation()/useFetcher()formMethodfields as uppercase HTTP methods to align with thefetch()behavior. (#10207)future.v7_normalizeFormMethod === false(default v6 behavior),useNavigation().formMethodis lowercaseuseFetcher().formMethodis lowercasefuture.v7_normalizeFormMethod === true:useNavigation().formMethodis uppercaseuseFetcher().formMethodis uppercasePatch Changes
createRoutesFromElements(#10193)@remix-run/router@1.5.0v6.9.0Compare Source
Minor Changes
React Router now supports an alternative way to define your route
elementanderrorElementfields as React Components instead of React Elements. You can instead pass a React Component to the newComponentandErrorBoundaryfields if you choose. There is no functional difference between the two, so use whichever approach you prefer 😀. You shouldn't be defining both, but if you doComponent/ErrorBoundarywill "win". (#10045)Example JSON Syntax
Example JSX Syntax
Introducing Lazy Route Modules! (#10045)
In order to keep your application bundles small and support code-splitting of your routes, we've introduced a new
lazy()route property. This is an async function that resolves the non-route-matching portions of your route definition (loader,action,element/Component,errorElement/ErrorBoundary,shouldRevalidate,handle).Lazy routes are resolved on initial load and during the
loadingorsubmittingphase of a navigation or fetcher call. You cannot lazily define route-matching properties (path,index,children) since we only execute your lazy route functions after we've matched known routes.Your
lazyfunctions will typically return the result of a dynamic import.Then in your lazy route modules, export the properties you want defined for the route:
An example of this in action can be found in the
examples/lazy-loading-router-providerdirectory of the repository.🙌 Huge thanks to @rossipedia for the Initial Proposal and POC Implementation.
Updated dependencies:
@remix-run/router@1.4.0Patch Changes
generatePathincorrectly applying parameters in some cases (#10078)v6.8.2Compare Source
Patch Changes
@remix-run/router@1.3.3v6.8.1Compare Source
Patch Changes
@remix-run/router@1.3.2v6.8.0Compare Source
Patch Changes
@remix-run/router@1.3.1[
v6.7.0](httpsConfiguration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.